home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga CD-ROM Collection
/
Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso
/
cactus
/
33
/
progs
/
demos
/
gadgets.gfa
(
.txt
)
< prev
next >
Wrap
GFA-BASIC Atari
|
1989-06-25
|
8KB
|
355 lines
' Gadgetstrukturen in GFA-Basic erzeugen
'
' Thomas Ströter
' 20.4.89 / 14:00h
'
gg_max&=20 ! maximal 20 Gadgets
DIM gg_ad%(gg_max&),gg_dx#(gg_max&),gg_dy#(gg_max&)
'
demo
> PROCEDURE readme
' Gadgets in GFA-Basic!
'
' Ablauf:
' Gadget initialisieren
' Fenster oder Screen öffnen
' mit addgadget Gadget anzeigen
' Fenster schließen
' Gadgetspeicher zurückgeben (free_gadget)
'
'
' booltextgadget(X,Y,Breite,Höhe,String,GADG_ID) keine Initialisierung
'
' init_propgadget(GADG_ID)
' size_propgadget(GADG_ID,X,Y,Breite,Höhe,x-steps,y-steps)
'
' init_stringgadget(GADG)
' size_stringgadget(GADG_ID,X,Y,Breite,Länge,String)
' make_ival(GADG_ID) macht aus einem String- ein IntegerGadget
' get_ival(GADG_ID,Integer%) liest den Integerwert aus
' get_string(GADG_ID,String) liest Stringwert aus
' text_gadget(GADG_ID,x_off,y_off,String,Farbe)
' border_gadget(x1_of,y1_off,x2_off,y2_of,GADG_ID)
'
' wichtig:
' Im geöffneten Fenster müssen die IDCMP-Flags für
' Gadget gedrückt (&H20)
' GADGET losgelassen (&H40)
' gesetzt sein.
' Geben Sie niemals ein Gadget frei, solange das dazugehörende
' Fenster noch geöffnet ist !
'
RETURN
> PROCEDURE demo
init_propgadget(i&)
size_propgadget(i&,150,30,200,10,31400,0)
text_gadget(i&,10,20,"Testme",3)
text_gadget(i&,0,-11,"Schiebe Gadget",1)
init_propgadget(j&)
size_propgadget(j&,250,50,100,50,16,8)
'
booltextgadget(150,80,44,10,"Test",h&)
border_gadget(1,-1,44,11,3,h&)
border_gadget(2,0,44,11,1,h&)
'
init_stringgadget(s&)
init_stringgadget(t&)
make_ivalgadget(s&)
'
size_stringadget(s&,20,90,10,20,"Click on me")
border_gadget(-1,-1,10*8,8,1,s&)
text_gadget(s&,-1,-11,"TextGadget",2)
text_gadget(s&,1,-10,"TextGadget",1)
text_gadget(s&,1,10,"Beliebig Beschriftbar !",3)
'
size_stringadget(t&,20,110,50,100,"String100")
border_gadget(-1,-1,50*8,8,1,t&)
'
WORD{0,0,0,640,200,&H668,&H1100F
w%=ADDRIN0)
addgadget(w%,i&)
addgadget(w%,h&)
addgadget(w%,s&)
addgadget(w%,j&)
addgadget(w%,t&)
~gg_ad%(s&),ADDRIN0),0)
' ~RefreshGadgets(gg_ad%(i&),WINDOW(0),0)
'
ende!=TRUE
ON MENU MESSAGE GOSUB whatgadget
REPEAT
RBOX
UNTIL ende!=FALSE
get_string(s&,m$)
get_ival(s&,kl%)
CLOSEW 0
'
FOR a&=0 TO gg_max&
free_gadget(i&)
NEXT a&
RETURN
> PROCEDURE whatgadget
LOCAL ad%,x&,y&
SELECT MENU(1)
' - Gadget gedrückt
CASE 32
' - Gadgets loslassen
CASE 64
ad%=MENU(4)
gg_id&=CARD{ADD(ad%,38)}
PRINT AT(10,15);"Gadget:";gg_id&;" "
SELECT CARD{ADD(ad%,16)}
' ** Boolean Gadget
CASE 1
' ** Proportional Gadget
CASE 3
x&=CINT(CARD{ADD(ad%,46)}/gg_dx#(gg_id&))
y&=CINT(CARD{ADD(ad%,48)}/gg_dy#(gg_id&))
PRINT AT(10,17);"x :";x&;" "
PRINT AT(10,18);"y :";y&;" "
CASE 4
' ** String/Integer Gadget
ENDSELECT
' - Close Gadget
CASE 512
ende!=FALSE
ENDSELECT
RETURN
'
> PROCEDURE init_propgadget(VAR pg_id&)
LOCAL ad%
pg_id&=-1
REPEAT
INC pg_id&
UNTIL pg_id&=gg_max& OR gg_ad%(pg_id&)=0
IF pg_id&=gg_max&
ALERT 0,"Alle Gadgetspeicher belegt ("+STR$(gg_max&)+")",1,"OK",a|
pg_id&=0
ELSE
gg_ad%(pg_id&)=MALLOC(74,&H10003)
ad%=gg_ad%(pg_id&)
CARD{ADD(ad%,12)}=3
CARD{ADD(ad%,14)}=3
CARD{ADD(ad%,16)}=3
LONG{ADD(ad%,18)}=ad%+66
LONG{ADD(ad%,34)}=ad%+44
CARD{ADD(ad%,38)}=pg_id&
CARD{ADD(ad%,44)}=1 ! Autoknob
ENDIF
RETURN
> PROCEDURE size_propgadget(pg_id&,x&,y&,w&,h&,xstep&,ystep&)
ad%=gg_ad%(pg_id&)
IF ad%<>0
ADD(ad%,4)}=x&
ADD(ad%,6)}=y&
ADD(ad%,8)}=w&
ADD(ad%,10)}=h&
CARD{ADD(ad%,44)}=1
IF xstep&<>0
CARD{ADD(ad%,50)}=DIV(&HFFFF,xstep&)
CARD{ADD(ad%,44)}=CARD{ADD(ad%,44)} OR 2
gg_dx#(pg_id&)=&HFFFF/xstep&
ELSE
CARD{ADD(ad%,50)}=&HFFFF
gg_dx#(pg_id&)=&HFFFF
ENDIF
IF ystep&<>0
CARD{ADD(ad%,52)}=DIV(&HFFFF,ystep&)
CARD{ADD(ad%,44)}=CARD{ADD(ad%,44)} OR 4
gg_dy#(pg_id&)=&HFFFF/ystep&
ELSE
CARD{ADD(ad%,52)}=&HFFFF
gg_dy#(pg_id&)=&HFFFF
ENDIF
ENDIF
RETURN
> PROCEDURE free_gadget(gg_id&)
LOCAL ad%,a%,b%
ad%=gg_ad%(gg_id&)
IF ad%<>0
' ! Textzurück
a%={ADD(ad%,26)}
IF a%<>0
WHILE a%<>0
b%={ADD(a%,16)}
~MFREE(a%,CARD{ADD(a%,20)})
a%=b%
WEND
ENDIF
' ! Border zurück
a%={ADD(ad%,18)}
IF AND(CARD{ADD(ad%,16)},7)=1 AND AND(CARD{ADD(ad%,12)},4)=0
IF a%<>0
WHILE a%<>0
b%={ADD(a%,12)}
~MFREE(a%,36)
a%=b%
WEND
ENDIF
ENDIF
' ! GadgetStruct zurück
IF {ADD(ad%,16)}=4
~MFREE(ad%,592) ! String/Integer Gadget
ELSE
~MFREE(ad%,74)
ENDIF
gg_ad%(gg_id&)=0
ENDIF
'
RETURN
> PROCEDURE booltextgadget(x&,y&,w&,h&,a$,VAR pg_id&)
pg_id&=-1
REPEAT
INC pg_id&
UNTIL pg_id&=gg_max& OR gg_ad%(pg_id&)=0
IF pg_id&=gg_max&
ALERT 0,"Alle Gadgetspeicher belegt ("+STR$(gg_max&)+")",1,"OK",a|
pg_id&=0
ELSE
w&=MAX(w&,LEN(a$)*8)
h&=MAX(h&,8)
gg_ad%(pg_id&)=MALLOC(74,&H10003)
ad%=gg_ad%(pg_id&)
CARD{ad%+4}=x&
CARD{ad%+6}=y&
CARD{ad%+8}=w&
CARD{ad%+10}=h&
CARD{ad%+12}=1
CARD{ad%+14}=&H103
CARD{ad%+16}=1
CARD{ad%+38}=pg_id&
text_gadget(pg_id&,(w&-LEN(a$)*8)/2,(h&-8)/2,a$,1)
ENDIF
RETURN
> PROCEDURE text_gadget(gg_id&,x&,y&,a$,c1|)
ad%=gg_ad%(gg_id&)
IF ad%<>0
a$=a$+CHR$(0)
ad%=ad%+26
IF {ad%}<>0
REPEAT
ad%={ad%}+16
UNTIL {ad%}=0
ENDIF
gt%=MALLOC(22+LEN(a$),&H10003)
LONG{ad%}=gt%
BYTE{gt%}=c1|
BYTE{gt%+2}=0
gt%+4}=x&
gt%+6}=y&
LONG{gt%+12}=gt%+22
CARD{gt%+20}=LEN(a$)+22
BMOVE V:a$,gt%+22,LEN(a$)
ENDIF
RETURN
> PROCEDURE addgadget(w%,gg_id&)
IF gg_ad%(gg_id&)<>0
~w%,gg_ad%(gg_id&),99)
~gg_ad%(gg_id&),w%,0)
ENDIF
RETURN
> PROCEDURE border_gadget(x1&,y1&,x2&,y2&,c|,gg_id&)
LOCAL ad%,a%
ad%=gg_ad%(gg_id&)
IF ad%<>0
ad%=ad%+18
IF {ad%}<>0
REPEAT
ad%={ad%}+12
UNTIL {ad%}=0
ENDIF
a%=MALLOC(36,&H10003)
LONG{ad%}=a%
' BYTE{add(a%,5)}=c|
BYTE{ADD(a%,4)}=c|
BYTE{ADD(a%,7)}=5
{ADD(a%,8)}=ADD(a%,16)
CARD{ADD(a%,16)}=x1& ! Border Struktur
CARD{ADD(a%,18)}=y1&
CARD{ADD(a%,20)}=x2&
CARD{ADD(a%,22)}=y1&
CARD{ADD(a%,24)}=x2&
CARD{ADD(a%,26)}=y2&
CARD{ADD(a%,28)}=x1&
CARD{ADD(a%,30)}=y2&
CARD{ADD(a%,32)}=x1&
CARD{ADD(a%,34)}=y1&
ENDIF
RETURN
> PROCEDURE init_stringgadget(VAR sg_id&)
LOCAL ad%
sg_id&=-1
REPEAT
INC sg_id&
UNTIL sg_id&=gg_max& OR gg_ad%(sg_id&)=0
IF sg_id&=gg_max&
ALERT 0,"Alle Gadgetspeicher belegt ("+STR$(gg_max&)+")",1,"OK",a|
sg_id&=0
ELSE
gg_ad%(sg_id&)=MALLOC(592,&H10003)
ad%=gg_ad%(sg_id&)
CARD{ADD(ad%,14)}=3 ! Avtivation
CARD{ADD(ad%,16)}=4 ! Type
LONG{ADD(ad%,34)}=ADD(ad%,44) ! Special Info
CARD{ADD(ad%,38)}=sg_id& ! ID
'
ad%=ADD(ad%,44) ! Strig-Info
{ad%}=ADD(ad%,36)
{ADD(ad%,4)}=ADD(ad%,36+256)
CARD{ADD(ad%,10)}=255
ENDIF
RETURN
> PROCEDURE size_stringadget(sg_id&,x&,y&,wscroll&,len&,a$)
LOCAL ad%
ad%=gg_ad%(sg_id&)
IF ad%<>0
IF CARD{ADD(ad%,16)}=4
len&=MIN(len&,255)
wscroll&=MIN(wscroll&,len&)
CARD{ADD(ad%,4)}=x&
CARD{ADD(ad%,6)}=y&
CARD{ADD(ad%,8)}=wscroll&*8
CARD{ADD(ad%,10)}=10
ad%=ADD(ad%,44)
CARD{ADD(ad%,10)}=ADD(len&,1)
IF a$<>""
CARD{ADD(ad%,16)}=LEN(a$)
BMOVE V:a$,{ad%},CARD{ADD(ad%,16)}
ENDIF
ENDIF
ENDIF
RETURN
> PROCEDURE get_string(sg_id&,VAR a$)
LOCAL ad%,len&
ad%=gg_ad%(sg_id&)
IF ad%<>0
IF CARD{ad%+16}=4
ad%=ADD(ad%,44) ! Zeiger Strinfo
len&=CARD{ADD(ad%,16)}
IF len&<>0
a$=STRING$(len&,32)
BMOVE {ad%},V:a$,len&
ENDIF
ENDIF
ELSE
a$=""
ENDIF
RETURN
> PROCEDURE make_ivalgadget(sg_id&)
LOCAL ad%,len&
ad%=gg_ad%(sg_id&)
IF ad%<>0
IF CARD{ad%+16}=4
CARD{ad%+14}=OR(CARD{ad%+14},&H800)
ENDIF
ENDIF
RETURN
> PROCEDURE get_ival(sg_id&,VAR integer%)
ad%=gg_ad%(sg_id&)
IF ad%<>0
IF AND(CARD{ad%+14},&H800)=&H800 AND CARD{ad%+16}=4
integer%={ad%+44+28}
ENDIF
ENDIF
RETURN